#include "search.h"
#include "ui_search.h"
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QResizeEvent>

Search::Search(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Search),
    isConnected(false),
    overlayLabel(nullptr)
{
    ui->setupUi(this);

    // 设置透明背景
    this->setStyleSheet("background: transparent;");

    // 创建覆盖层
    createOverlay();
    updateDisconnectedState();

    // 连接刷新按钮
    connect(ui->refreshButton, &QPushButton::clicked, this, [this]() {
        if (isConnected) {
            // 发送设备搜索请求
            QJsonObject searchRequest;
            searchRequest["cmd"] = "discover_devices";

            QJsonDocument doc(searchRequest);
            QByteArray message = doc.toJson();

            if (GlobalVal::mqtt) {
                QMQTT::Message mqttMessage;
                mqttMessage.setTopic("MQTT  rec");
                mqttMessage.setPayload(message);
                GlobalVal::mqtt->publish(mqttMessage);
                qDebug() << "[Search]: 发送设备搜索请求:" << QString(message);
            }

            ui->statusLabel->setText("正在搜索设备...");
        }
    });

    qDebug() << "[Search]: 界面初始化完成";
}

Search::~Search()
{
    destroyOverlay();
    delete ui;
}

// 数据接收槽函数 - 修改重点
void Search::dataUpSlot(const QByteArray &msg)
{
    if (!isConnected) {
        setConnectedState(true);  // 如果未连接，设置为已连接状态
    }

    qDebug() << "[Search]: 收到MQTT消息:" << msg;

    QJsonDocument doc = QJsonDocument::fromJson(msg);
    if(!doc.isObject()) {
        qDebug() << "[Search]: JSON解析失败";
        return;
    }

    QJsonObject obj = doc.object();

    // 新增：处理设备状态消息（包含id和devstate）
    if(obj.contains("id") && obj.contains("devstate")) {
        QString deviceId = obj["id"].toString();
        int devstate = obj["devstate"].toInt();

        qDebug() << "[Search]: 发现设备状态消息 - ID:" << deviceId << "状态:" << devstate;

        // 添加或更新设备显示
        addOrUpdateDevice(deviceId, devstate);
        return;  // 处理完设备状态消息后返回
    }

    // 原有的设备发现消息处理（保持兼容）
    if(obj.contains("device_discovery")) {
        QString deviceInfo = obj["device_discovery"].toString();
        qDebug() << "[Search]: 发现设备:" << deviceInfo;

        // 可以在这里添加对传统设备发现消息的处理
    }

    // 原有的设备列表更新处理（保持兼容）
    if(obj.contains("device_list")) {
        qDebug() << "[Search]: 收到设备列表更新";
        // 处理设备列表数据
    }
}

// 新增：添加或更新设备显示
void Search::addOrUpdateDevice(const QString& deviceId, int devstate)
{
    QString stateText;
    QString stateColor;

    // 根据设备状态设置显示文本和颜色
    switch (devstate) {
    case 0:
        stateText = "离线";
        stateColor = "red";
        break;
    case 1:
        stateText = "在线";
        stateColor = "green";
        break;
    case 2:
        stateText = "忙碌";
        stateColor = "orange";
        break;
    default:
        stateText = "未知";
        stateColor = "gray";
        break;
    }

    // 创建显示文本
    QString displayText = QString("设备ID: %1 - 状态: %2").arg(deviceId).arg(stateText);

    if (deviceItems.contains(deviceId)) {
        // 更新现有设备项
        QListWidgetItem* item = deviceItems[deviceId];
        item->setText(displayText);
        item->setForeground(QColor(stateColor));
        qDebug() << "[Search]: 更新设备:" << deviceId << "状态:" << stateText;
    } else {
        // 添加新设备项
        QListWidgetItem* item = new QListWidgetItem(displayText);
        item->setForeground(QColor(stateColor));
        item->setFont(QFont("Arial", 12));
        ui->deviceListWidget->addItem(item);
        deviceItems[deviceId] = item;
        qDebug() << "[Search]: 添加新设备:" << deviceId << "状态:" << stateText;
    }

    // 更新状态标签显示发现的设备数量
    ui->statusLabel->setText(QString("已发现 %1 个设备").arg(deviceItems.count()));
}

// 设置连接状态
void Search::setConnectedState(bool connected)
{
    isConnected = connected;
    qDebug() << "[Search]: 设置连接状态:" << connected;

    if (connected) {
        destroyOverlay();  // 连接时销毁覆盖层
        ui->statusLabel->setText("已连接，等待设备发现...");
        ui->refreshButton->setEnabled(true);
    } else {
        if (!overlayLabel) createOverlay();  // 未连接时创建覆盖层
        updateDisconnectedState();  // 更新未连接状态
        ui->refreshButton->setEnabled(false);
    }
}

// 创建覆盖层
void Search::createOverlay()
{
    if (overlayLabel) destroyOverlay();

    overlayLabel = new QLabel(this);
    overlayLabel->setGeometry(0, 0, this->width(), this->height());
    overlayLabel->setStyleSheet("background-color: rgba(128, 128, 128, 150); color: red; font-size: 70px; font-weight: bold;");
    overlayLabel->setAlignment(Qt::AlignCenter);
    overlayLabel->setText("设备未连接");
    overlayLabel->setVisible(true);
    overlayLabel->raise();

    qDebug() << "[Search]: 创建覆盖层";
}

// 销毁覆盖层
void Search::destroyOverlay()
{
    if (overlayLabel) {
        overlayLabel->setVisible(false);
        overlayLabel->deleteLater();
        overlayLabel = nullptr;
        qDebug() << "[Search]: 销毁覆盖层";
    }
}

// 更新未连接状态
void Search::updateDisconnectedState()
{
    if (overlayLabel) {
        overlayLabel->setVisible(true);
        overlayLabel->raise();
    }

    // 清空设备列表
    ui->deviceListWidget->clear();
    deviceItems.clear();
    ui->statusLabel->setText("未连接，无法搜索设备");

    qDebug() << "[Search]: 更新为未连接状态";
}

// 窗口大小改变事件处理
void Search::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);
    if (overlayLabel) {
        overlayLabel->setGeometry(0, 0, this->width(), this->height());
        overlayLabel->raise();
    }
}

void Search::on_refreshButton_clicked()
{
    // 刷新按钮点击处理
    if (isConnected) {
        // 清空当前列表重新搜索
        ui->deviceListWidget->clear();
        deviceItems.clear();
        ui->statusLabel->setText("正在搜索设备...");

        // 发送搜索请求
        QJsonObject searchRequest;
        searchRequest["cmd"] = "refresh_devices";

        QJsonDocument doc(searchRequest);
        QByteArray message = doc.toJson();

        if (GlobalVal::mqtt) {
            QMQTT::Message mqttMessage;
            mqttMessage.setTopic("MQTT  rec");
            mqttMessage.setPayload(message);
            GlobalVal::mqtt->publish(mqttMessage);
            qDebug() << "[Search]: 发送刷新请求:" << QString(message);
        }
    }
}
